package com.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * public static Object newProxyIntance（ClassLoader loader， class<?>[] interfaces，InvocationHander h）
 * 参数一：类加载器：负责加载代理类到内存中使用
 * 参数二：获取被代理对象实现全部接口，代理要为接口的全部方法进行代理
 * 参数三：代理的核心处理逻辑
 */

public class ProxyUtil {
    public static UserService getProxy(UserService obj){
        //通过Proxy类的newProxyIntance方法来创建代理对象
        return (UserService) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
                //第三个参数里面就是我们要实现的核心逻辑功能
                new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //参数一：代理对象本身
                //参数二：正在被代理的方法
                //参数三：被代理方法的参数

                //1.首先先记录程序开始执行的时间
                long startTime=System.currentTimeMillis();
                //2.开始执行方法内容,带入参数
                Object invoke = method.invoke(obj,args);
                //3.记录程序执行结束的时间
                long endTime=System.currentTimeMillis();
                System.out.println(method.getName()+"方法执行时间为："+(endTime-startTime)/1000.0+"s");
                return invoke;




            }
        });
    }
}
